#ifndef QLSVTABWIDGET_H
#define QLSVTABWIDGET_H

#include <QTabWidget>

#include <plugins_manager/qls_interface.h>
#include <plugins_manager/qls_plugins_manager.h>

#include "qls_plugins_manager_appfwk_global.h"

class QLsPluginsManagerTableWidget;
class QLsVTabBar;

class QLS_PLUGINS_MANAGER_APPFWK_EXPORT QLsPluginsManagerAppfwk : public QTabWidget
{
    Q_OBJECT
public:
    /* 标签样式 */
    enum QLsTabStyle
    {
        NORTH = 0,
        WEST
    };

    QLsPluginsManagerAppfwk(QWidget *parent = nullptr);
    ~QLsPluginsManagerAppfwk();

    /* 标签样式 */
    QLsTabStyle tabStyle() const;
    void setTabStyle(const QLsTabStyle &tabStyle);

    /* 当前主题名 */
    QString curThemeName() const;
    void setCurThemeName(const QString &curThemeName);

    /* 插件路径 */
    QString pluginsDir() const;
    void setPluginsDir(const QString &pluginsDir);

    /* 插件信息配置文件路径 */
    QString pluginsIniDir() const;

    /* 获取插件管理器类接口 */
    QLsPluginsManagerTableWidget *GetPluginsManagerTableWidget();

    /* 获取插件窗口 */
    QWidget *GetPluginsWidgetByIndex(int index);
    QWidget *GetPluginsWidgetByPluginsName(const QString &pluginsName);
    inline QWidget *GetPluginsWidgetByPluginInfo(PluginInfo &pluginInfo)
    {
        return GetPluginsWidgetByPluginsName(
            pluginInfo.m_interfaceInfo->m_name);
    }

    /* 加载全部插件 */
    void LoadAllPlugin();

    /* 是否显示插件管理器界面 */
    bool isShowPluginsManagerTab() const;
    void setIsShowPluginsManagerTab(bool isShowPluginsManagerTab);

    /* 主题管理器 */
    QLsThemesManager *themesManager() const;

    /* 是否隐藏标签栏 */
    bool bHideTabBar() const;
    void setBHideTabBar(bool bHideTabBar);

signals:
    /* 加载结果的信号 */
    void sigLoadRes(PluginInfo &);
    /* 最小尺寸变化的信号 */
    void sigChangeMinimumSize(QSize);

public slots:
    /* 加载、卸载插件的槽函数 */
    void slotPluginLoad(PluginInfo &pluginInfo);
    /* 插件的最小尺寸变化的槽函数 */
    void slotPluginsChangeMinimumSize();

private:
    /* 主界面初始化 */
    void HomeInit();
    /* 填充插件窗口 */
    void PopulateWindows(const PluginInfo &info);
    /* 移除插件窗口 */
    void RemoveWindows(const PluginInfo &info);
    /* 更新最新尺寸 */
    void UpdateMinimumSize();

private:
    QLsPluginsManagerTableWidget *pluginsManagerTableWidget;
    QTabBar *hTabBar;
    QLsVTabBar *vTabBar;

    int m_tabWidgetMiniWidth;
    int m_tabWidgetMiniHeight;

    bool m_isShowPluginsManagerTab; /* 是否显示插件管理器界面 */
    QLsTabStyle m_tabStyle;         /* 标签样式 */

    QString m_curThemeName; /* 当前主题名 */

    QString m_pluginsDir;    /* 插件路径 */
    QString m_pluginsIniDir; /* 插件信息配置文件路径 */

    QStringList m_pluginsNameList; /* 插件名列表，按ui->showTabWidget顺序 */

    bool m_bHideTabBar; /* 是否隐藏标签栏 */
};

#endif // QLSVTABWIDGET_H
